// WebSocket 服务端
// Import Module
const express = require("express")
const path = require("path")
const socketio = require("socket.io")
const http = require("http")
const formatMessage = require("./util/message")
const { userJoinIn, userExit, getCurrUser, getRoomUsers } = require("./util/users")

// Initialize
const app = express()
const server = http.createServer(app)
const io = socketio(server)

// 设置静态文件
app.use(express.static(path.join(__dirname, 'public')))

// 聊天室助手
const ChatBot = "聊天助手"

// 监听客户端是否触发连接事件
io.on("connection", function (socket) {
    console.log("new connection established...", socket.id)

    // ---------登录---------
    // ---------分发房间---------
    socket.on("joinRoom", function ({ username, room }) {
        let user = userJoinIn(socket.id, username, room)
        // 加入对应房间
        socket.join(user.room)

        // 消息一对一发送
        socket.emit('message', formatMessage(ChatBot, '欢迎加入MorphChat聊天室'))

        // 消息广播（除了自身）
        socket.broadcast.to(user.room).emit("message", formatMessage(ChatBot, `欢迎${user.username}加入${user.room}房间`))

        // 更新客户端的用户组显示
        io.to(user.room).emit("updateInfos", {
            room: user.room,
            users: getRoomUsers(user.room)
        })
    })

    // ---------聊天---------
    // 处理从客户端收到的消息
    socket.on("chatMessage", function (msg) {
        let user = getCurrUser(socket.id)
        // io.emit可以广播给包括自身的所有人
        io.to(user.room).emit("message", formatMessage(user.username, msg))
    })

    // ---------登出---------
    // 监听客户端是否断开链接
    socket.on("disconnect", function () {
        let user = userExit(socket.id)
        if (user != null) {
            console.log("connection has lost...", user.id)
            io.to(user.room).emit("message", formatMessage(ChatBot, `${user.username}已下线`))

            // 更新客户端的用户组显示
            io.to(user.room).emit("updateInfos", {
                room: user.room,
                users: getRoomUsers(user.room)
            })
        }
    })
})

// 监听端口
const PORT = 8080

server.listen(PORT, function () {
    console.log("Server started at port " + PORT)
})